Mengalihkan dari pemrograman CPU secara serial ke pemrograman GPU membutuhkan perubahan paradigma: dari iterasi elemen demi elemen ke eksekusi berbasis blok. Kita tidak lagi melihat data sebagai aliran skalar, tetapi sebagai kumpulan "blok" yang dijadwalkan untuk memenuhi bandwidth perangkat keras.
1. Terbatas oleh Memori vs. Terbatas oleh Komputasi
Keterbatasan sebuah kernel ditentukan oleh rasio operasi matematika terhadap akses memori. Penjumlahan vektor sering kali terbatas oleh memori karena hanya melakukan satu penambahan untuk setiap tiga operasi memori (2 muat, 1 simpan). Perangkat keras menghabiskan lebih banyak waktu menunggu DRAM daripada menghitung.
2. Peran BLOCK_SIZE
BLOCK_SIZE menentukan tingkat granularitas paralelisme. Jika terlalu kecil, kita kurang memanfaatkan jalur eksekusi lebar GPU. Ukuran optimal memastikan adanya cukup "pekerjaan yang sedang berjalan" untuk memenuhi bus memori.
3. Menyembunyikan Latensi Melalui Occupancy
Occupancy adalah jumlah blok aktif pada GPU. Meskipun bukan tujuan utama, hal ini memungkinkan scheduler untuk mengganti blok baru agar melakukan komputasi sementara blok lain menunggu pengambilan memori dengan latensi tinggi dari VRAM.
4. Pemanfaatan Perangkat Keras
Untuk memaksimalkan kinerja, kita harus menyesuaikan BLOCK_SIZE dengan aturan penggabungan memori arsitektur GPU, memastikan bahwa thread yang berurutan mengakses alamat memori yang berurutan.